package org.example.selenium;

import org.apache.commons.io.FileUtils; // 需确保依赖已正确引入
import io.github.bonigarcia.wdm.WebDriverManager;
import org.junit.jupiter.api.DisplayNameGenerator;
import org.junit.jupiter.api.TestReporter;
import org.openqa.selenium.*;

import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.example.selenium.FirstText;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;

import javax.lang.model.element.Element;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.time.Duration;
import java.util.List;
import java.util.Set;

public class FirstText {

    WebDriver driver = null;

    void createDriver(){
        //1.打开浏览器
        //先打开驱动:
        WebDriverManager.chromedriver().setup();

        //增加浏览器配置：创建驱动对象要强制指定允许访问所有的链接
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");

        //手动设置无头模式
      //  options.addArguments("-headless");

        //浏览器加载策略: NORMAL就是等待所有的资源加载完成：
        options.setPageLoadStrategy(PageLoadStrategy.NONE);


        //创建一个浏览器驱动对象：
        driver = new ChromeDriver(options);
       // driver.get("https://www.baidu.com");
        //driver.get("https://tool.lu/");
        driver.get("https://www.bilibili.com/");
    }



    //测试百度搜索关键词：迪丽热巴
    void test01() throws InterruptedException {

        createDriver();
        //2.输入百度网址：https://www.baidu.com
        //get表示的是我们呀请求的是哪一个网站

        Thread.sleep(3000);

        //3.找到输入框，并输入关键词：迪丽热巴
        //: 查找 #kw表示的是前端的输入框
        driver.findElement(By.cssSelector("#kw")).sendKeys("迪丽热巴");
        Thread.sleep(3000);
        //4.找到百度一下按钮，并点击
        driver.findElement(By.cssSelector("#su")).click();
        Thread.sleep(3000);
        //5.关闭浏览器
        driver.quit();
        Thread.sleep(3000);
    }

    //进阶版本的屏幕截图
    void getScreenShot(String str) throws IOException {



        // 放到文件夹：./src/test/image/
        //                           2024-07-17/
        //                                     /test01-174530.png
        //                                     /test02-174580.png
        //                           2024-07-18/
        //                                     /test01-174530.png
        //                                     /test02-174580.png
        SimpleDateFormat sim1 = new SimpleDateFormat("yyyy-MM-dd");
        SimpleDateFormat sim2  = new SimpleDateFormat("HHmmss");

        String dirTime = sim1.format(System.currentTimeMillis());
        String fileTime = sim2.format(System.currentTimeMillis());

        String filename = "./src/test/image/"+dirTime+ "/"+str + "-" +fileTime+".png";

        //屏幕截图
        File srcFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
        //把src放到指定的位置
        FileUtils.copyFile(srcFile,new File(filename));
    }

    //实现元素的定位
    void test02() throws InterruptedException {
        createDriver();
        //选择器
        //2Thread.sleep(8000);
        driver.findElement(By.cssSelector("#hotsearch-content-wrapper > li:nth-child(1) > a > span.title-content-title"));
        driver.findElement(By.xpath("//*[@id=\"kw\"]"));

        List<WebElement> ll = driver.findElements(By.cssSelector("#hotsearch-content-wrapper > li>a>span.title-content-title"));
        for(int i = 0; i < 10;i++){
            System.out.println(ll.get(i).getText());
        }
        driver.quit();

    }


    //操作元素对象
    void test03(){
        createDriver();

        WebElement element = driver.findElement(By.cssSelector("#i_cecream > div.bili-feed4 > div.bili-header.large-header > div.bili-header__channel > div.channel-icons > a:nth-child(2)"));
        element.click();

        driver.quit();
    }

    //切换窗口
    void test04() throws InterruptedException, IOException {
        createDriver();

        //当前页面的handle
        String curHandle = driver.getWindowHandle();
        System.out.println(curHandle);

        //跳转页面,点击新闻
        driver.findElement(By.cssSelector("#s-top-left > a:nth-child(1)")).click();
        //获取到所有页面的Handle
        Set<String> allHandles = driver.getWindowHandles();
        Thread.sleep(3000);
        for(String handle : allHandles){

            if(handle != curHandle){
             //curHandle是百度一下的页面，如果遍历到的这个句柄不等于百度一下这个句柄
            //说明当前遍历到的handle是需要进行切花的句柄
                driver.switchTo().window(handle);  //将百度一下句柄切换为百度新闻的句柄
            }
        }
        Thread.sleep(3000);


       getScreenShot(getClass().getName());

        //测试百度新闻的首页
        driver.findElement(By.cssSelector("#headline-tabs > ul > li > a"));

        Thread.sleep(3000);
        //关闭当前标签页，也就是当前窗口
        driver.close();

        Thread.sleep(3000);


        //quit关闭的是整个浏览器
        driver.quit();
    }


    void test05() throws InterruptedException, IOException {
        createDriver();

        driver.findElement(By.cssSelector("#kw")).sendKeys("迪丽热巴");
        driver.findElement(By.cssSelector("#su")).click();
        String curHandle = driver.getWindowHandle();
        System.out.println(curHandle);

       // Thread.sleep(3000);
        //driver.findElement(By.cssSelector("#\\31  > div > div > div > div > div > div.new-tag_4ozgi.new-text-link_3k9GD > div > div.flex-wrapper-top_3ucFS > div.flex-col-left_3trtY.baike-wrapper_6AORN.cu-pt-xs-lg.baike-wrapper-pc_26R04.cu-pt-xl.baike-wrapper-left-pc_5eYY8.cos-space-pb-sm > div > div > p > span:nth-child(1) > span"));

        //隐式等待: 隐式约定等待三秒：
        //driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
       // driver.findElement(By.xpath("//*[@id=\"1\"]/div/div/div/div/div/div[2]/div/div[1]/div[1]/div/div/p/span[1]/span"));

        Thread.sleep(1000);
        driver.findElement(By.cssSelector("#\\35  > div > div > h3 > a"));
        driver.findElement(By.cssSelector("#\\35  > div > div > h3 > a")).click();
        Set<String> allHandles = driver.getWindowHandles();
        Thread.sleep(1000);
        for(String handle : allHandles){
            if(handle != curHandle){
                //curHandle是百度一下的页面，如果遍历到的这个句柄不等于百度一下这个句柄
                //说明当前遍历到的handle是需要进行切花的句柄
                driver.switchTo().window(handle);  //将百度一下句柄切换为百度新闻的句柄
            }
        }
        Thread.sleep(1000);


        getScreenShot(getClass().getName());
        driver.quit();
    }

    //显式等待
    void test06(){
        createDriver();
        //1. 先去创建一个显式等待的对象
       WebDriverWait wait = new WebDriverWait(driver,Duration.ofSeconds(3));
        wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("#su")));

        driver.findElement(By.cssSelector("#su")).click();

        //百度输入框是否存在
       // wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#kw")));
       // driver.findElement(By.cssSelector("#kw")).sendKeys("迪丽热巴");


        wait.until(ExpectedConditions.textToBe(By.cssSelector("#s-top-left > a:nth-child(1)"), "新闻"));


        driver.quit();
    }

    //浏览器导航
    void test07() throws InterruptedException {
        createDriver();
        Thread.sleep(2000);

        //通过点击进入到网页上的文库：
        driver.findElement(By.cssSelector("#nav > div > div > ul > li:nth-child(3) > a")).click();
        Thread.sleep(2000);

        //浏览器回退，回退到工具页面：
        driver.navigate().back();
        Thread.sleep(2000);

        //浏览器前进：前进到文库页面：
        driver.navigate().forward();
        Thread.sleep(2000);

        //浏览器刷新： 文库
        driver.navigate().refresh();

        driver.quit();
    }

    //弹窗
    void test08(){
        createDriver();

        //调起弹窗
        driver.findElement(By.cssSelector("#tooltip")).click();

        //切换弹窗：
        Alert alert = driver.switchTo().alert();

        //点击确认：
        alert.accept();

        driver.findElement(By.cssSelector("tooltip"));
        driver.quit();

    }
}
